function createXMLDoc()
{
    return document.implementation.createDocument("", "", null);
}
XMLDocument.prototype.loadXML = function(xmlString)
 {
    var childNodes = this.childNodes;
    for (var i = childNodes.length - 1; i >= 0; i--)
        this.removeChild(childNodes[i]);

    var dp = new DOMParser();
    var newDOM = dp.parseFromString(xmlString, "text/xml");
    var newElt = this.importNode(newDOM.documentElement, true);
    this.appendChild(newElt);
 };

if( document.implementation.hasFeature("XPath", "3.0") )
 {
    XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
    {
      if( !xNode ) { xNode = this; } 
      var oNSResolver = this.createNSResolver(this.documentElement)
      var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
      var aResult = [];
      aResult.length = aItems.snapshotLength;
      for( var i = 0; i < aItems.snapshotLength; i++)
       {
          aResult[i] =   aItems.snapshotItem(i);
       }
       aResult.item=function(index){
           return aResult[index]
       }
      return aResult;
    }

    Element.prototype.selectNodes = function(cXPathString)
    {
      if(this.ownerDocument.selectNodes)
       {
         return this.ownerDocument.selectNodes(cXPathString, this);
       }
      else{throw "For XML Elements Only";}
    }
    XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
    {
      if( !xNode ) { xNode = this; } 
      var xItems = this.selectNodes(cXPathString, xNode);
      if( xItems.length > 0 )
       {
         return xItems[0];
       }
      else
       {
         return null;
       }
    }
   
    Element.prototype.selectSingleNode = function(cXPathString)
    {    
      if(this.ownerDocument.selectSingleNode)
       {
         return this.ownerDocument.selectSingleNode(cXPathString, this);
       }
      else{throw "For XML Elements Only";}
    }
 }